問題解説: 研究の国 第三のトラブル
おはようございます、作問者のやつはしです。
今回は、リソース削減・ネットワーク基盤に依存しないために全て一つのVM上で完結させました。
残念ながら、この問題に辿りついたチームは1つで、解答数は0でした。
日の目を見ることはなかった問題ですが、SDNに関する問題は、今までなかったので参考問題として公開します。
問題文
無事に課題が終わったパトリシアは、学校を案内してくれることになった。
パトリシア「課題を手伝ってくれてありがとう♪。じゃあ学校を案内するね」
食堂や教室、体育館などを案内してもらった。
パトリシア「ここが最後よ–ここは私が志望してる研究室で、魔法陣の仮想化を研究しているの」
パトリシア「教授は、OpenFlowを使って特殊なNATを作成しているの……でも、昨日Dockerコンテナに移行してから動いていないそうなの」
エイト「ふむ、ここで教授に恩を売っておきたいところね」
パトリシア「そうなの、でも、私一人じゃできなくて……何度も悪いんだけど、手伝ってくれないかな?」
アクセスできるサーバー
- サーバ名 : openflow
- アドレス : openflow.3.mgi
- ユーザ : admin
- パスワード : hello_openflow
注意事項
- VyOS1・VyOS2・VyOS3・VyOS4のIPアドレス・サブネット・VLANに変更を加えてはいけない。(Config自体は変えてもよい)
- コンテナの停止・再起動は許可する。
達成すべき事項
- VyOS4で
ping 172.16.100.150
を実行し、VyOS3より返答を受け取れる。 - OpenFlow を使って、 192.168.1.2->172.16.100.150 の SNAT と 172.16.100.150->192.168.1.2 の DNAT を実現する。
その他
OVSがインストールされたUbuntu上に、以下の5つのコンテナが存在する。
– VyOS1(192.168.1.1/24 & 172.16.100.100/24)
– VyOS2(172.16.100.200/24 & 10.30.100.1/24)
– VyOS3(192.168.1.2/24)
– VyOS4(10.30.100.2/24)
– OpenFlowController(Docker Default Network)
以下に簡単なトポロジーを示す。
VyOS3(192.168.1.2)-(192.168.1.1)VyOS(172.16.100.100)-(172.16.100.200)VyOS2(10.30.100.1)-VyOS4(10.30.100.2)
解説
この問題は、OpenvSwitch上でOpenFlowを動かしたもの。
まず、この問題の初期状態は、このようになっている。
OVSの設定を
sudo ovs-vsctl show
で確認すると、VyOS3-VyOS1,VyOS2-VyOS4では、
sudo ovs-vsctl set-fail-mode br0 standalone
sudo ovs-vsctl set-fail-mode br2 standalone
で設定してあり、L2スイッチとして動作している。
次にVyOS1-VyOS2では、
sudo ovs-vsctl set-fail-mode br1 secure
で、OpenFlowのエントリーによって処理されている。
そこで、
sudo ovs-ofctl dump-flows br1 --protocols=OpenFlow13
でエントリーを確認できる。
エントリーでは、図に書いてあるようなIP変換のみ処理されている。
ここでarpによるmacアドレスの解決ができないことに注目する。
なのでVyOS1とVyOS2でお互いにstaticでmacアドレスをお互いに登録する。
しかし、VyOSのconfigにインターフェースの設定を書いた場合、OVSにインターフェースの主導権をとられているため、反映されない。
VyOS1とVyOS2には以下のコマンドでvbashに入る
docker exec -it vyos1 /bin/vbash
docker exec -it vyos2 /bin/vbash
そして、linuxの処理として
arp -s 172.16.100.100 "VyOS2のmacアドレス" dev eth1
arp -s 172.16.100.200 "VyOS1のmacアドレス" dev eth1
staticでmacアドレスと登録する。
これでL2を解決できた。
次に、VyOS3からVyOS4にICMPパケットを飛ばすには、
VyOS1で
docker exec -it vyos1 /bin/vbash
su - vyos
configure
set protocols static route 10.30.100.0/24 next-hop 172.16.100.200
commit
save
のように設定する。
この設定で、ルーティングができるようになったのでICMPパケットが飛ぶ。
これでSDNの一端であるOpenFlowを用いた問題は解決である。
SDNでは、arpやDHCPなどL2の処理をプログラムしなければならない煩わしさがあるが、この問題のようにトポロジーを工夫することで、こういったNATやファイアーウォールなどのフィルターを、簡単に書き導入することが可能である。
ICTSC7では、運営でNAVT(Network Address Vlan Translation[作問者命名])と呼ばれるVLAN+IPaddressを全く別のIPに割り当てることでそれぞれのチームのセグメントIPを同じにし、運営からは、任意のIPアドレスで全チームにアクセスできるようにした。